﻿using System.Collections.Generic;

namespace Plugins.Interfaces
{
    /// <summary>
    /// интерфейс коллекции позволяющей перемещаться по коллекции в двух направлениях
    /// </summary>
    public interface IPluginDequeueCollection<T> : IList<T>, ICollection<T>, IEnumerable<T>
    {
        /// <summary>
        /// функция позволяет перемещаться по коллекции в обратном направлении
        /// </summary>
        /// <returns>возвращает флаг, сигнализирущий об успехе операции</returns>
        /// <remarks>истина, если текущий указатель на объект до его перемещения стоит на обьекте коллекции, или может на него переместиться, ложь в противном случае</remarks>
        bool MovePrevious();

        /// <summary>
        /// текущее значение указателя в коллекции
        /// </summary>
        int Position { get; }

        bool CanMovePrevious(int index);
        bool CanMoveNext(int index);

        void AddFirst(T value);
        void AddLast(T value);

        bool RemoveFirst();
        bool RemoveLast();

        void AddFirstLastOut(T value, int capacity);
        void AddLastFirstOut(T value, int capacity);
        void AddFirstLastCenterOut(T head, T tail);

        T PreviousItem { get; }
        T NextItem { get; }

        void Resize(Direction direction, int capacity);
    }
    public enum Direction
    {
        Head,
        Tail
    }
}
